package com.heima.lock.collection;

import java.lang.reflect.Field;
import java.util.ArrayList;

/**
 * @author 陈辉
 * @data 2024 14:02
 *
 * ArrayList的扩容机制：
 *   1. 无参构造构建ArrayList集合时，默认底层创建的是一个长度为0的空数组，数组名：elementData
 *
 *   2. 第一次往集合中添加数据时，底层源码会将数组由0 扩容到初始长度为 10.  扩容方法：grow()
 *
 *   3. 后续当集合底层数组存满时，会按照1.5倍系数扩容。最大能扩到int最大值 - 8。
 *
 *          问： ArrayList集合第三次扩容，底层数组长度是多少？
 *            0  --> 10
 *            10 --> 15
 *            15 --> 22
 *
 */

public class ArrayListDemo1 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        System.out.println("刚创建的集合底层数组容量为："+getLength(list));
        list.add("hello");

        System.out.println("第一次添加后集合底层数组容量为："+getLength(list));
        for (int i = 1; i <= 10; i++) {
            list.add("word");
        }
        System.out.println("第11次添加后集合底层数组容量为："+getLength(list));

        System.out.println(list);
    }

    //设计一个方法，用来求ArrayList底层elementData数组的长度
    private static int getLength(ArrayList<String> list){
        try {
            Class clazz = list.getClass();
            Field elementDataField = clazz.getDeclaredField("elementData");
            elementDataField.setAccessible(true);

            //反射获取数组长度
            Object[] arr = (Object[]) elementDataField.get(list);
            return arr.length;
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }
    }
}
